#include <stdio.h>
#include <string.h>
#include <malloc.h>

struct enlace
{
  char ip[11];
  int port;
  int dest[6];
  int mtu[6];
};

struct enlace enlaces[6];

void loadCI ()
{
  int index = 0, no_dest = 0, i = 0, j = 0, k = 0;
  char *aux = (char*)malloc(sizeof(char) * 255);
  char *info = NULL;
  char *separadores = " ,:;>"; // separadores dos tokens
  FILE *pFile;

  free(info);

  //Inicializacao do vetor de estrutura
  for (i = 0; i < 6; i++)
  {
      for(k = 0; k < 11; k++)
      {
        enlaces[i].ip[k] = 0;
	  }

      enlaces[i].port = 0;

      for(j = 0; j < 6; j++)
	  {
        enlaces[i].dest[j] = 0;
        enlaces[i].mtu[j] = 0;
	  }
  }

  //Abertura do arquivo de configuraçao inicial para leitura
  pFile = fopen("topologia.cnf", "r"); //arquivo que contem a configuracao inicial da rede (enlaces)
  if(!pFile)
  {
    printf("Arquivo nao encontrado!!!\n");
  }
  else
  {
      fgets(aux, 255, pFile);
      aux[strlen(aux)-1] = '\0';

      //Rotina de transferencia dos dados da topologia da rede para a memoria (vetor de estrutura)
      if(strcmp(aux,"Nos") == 0)
      {
          fgets(aux, 255, pFile);

          info = strtok(aux, separadores);

          while(strcmp(info,"Enlaces") != 0)
          {
              index = atoi(info);
              index -= 1;
              info = strtok(NULL, separadores);
              strcpy(enlaces[index].ip, info);

              info = strtok(NULL, separadores);
              enlaces[index].port = atoi(info);

              fgets(aux, 255, pFile);
              aux[strlen(aux)-1] = '\0';

              info = strtok(aux, separadores);
          }
      }
      else printf("Formatacao da CI esta errada!!!\n");
  }

  fgets(aux, 255, pFile);
  info = strtok(aux, separadores);

  while(strcmp(info,"Fim") != 0)
  {
      index = atoi(info);
      index -= 1;
      info = strtok(NULL, separadores);

      no_dest = atoi(info);
      no_dest -= 1;

      enlaces[index].dest[no_dest] = 1;
      enlaces[no_dest].dest[index] = 1;

      info = strtok(NULL, separadores);
      enlaces[index].mtu[no_dest] = atoi(info);
      enlaces[no_dest].mtu[index] = atoi(info);

      fgets(aux, 255, pFile); // Leitura sempre no final do bloco, pra nao tentar processar dados depois de "Fim"
      info = strtok(aux, separadores);
  }

  //Verificaçao feita sobre o vetor de estrutura para saber se foi corretamente populado
  for (i = 0; i < 4; i++)
  {
      printf("IP: %s PORTA: %d NO_ORIGEM: %d\n", enlaces[i].ip, enlaces[i].port, i+1);
      for(j = 0; j < 4; j++)
	  {
          if(enlaces[i].dest[j])
            printf(" NO_DEST: %d ", j+1);
          else
            printf(" NO_DEST: %d ", enlaces[i].dest[j]);

          printf("MTU_ENL: %d\n", enlaces[i].mtu[j]);
	  }
  }
  fclose(pFile);
}

int main(int argc, char** argv)
{
    loadCI();
    return (EXIT_SUCCESS);
}
